package com.sew.sewweb.common.utils;

import java.util.concurrent.atomic.AtomicLong;

/**
 * @author Guoan
 * @date 2025/9/9 - 16:38
 */
public class SerialNumberGenerator {
    private final String prefix;
    private final int serialNumberLength;
    private final AtomicLong counter;

    /**
     * 构造函数
     * @param prefix 固定前缀
     * @param serialNumberLength 流水号长度
     * @param startValue 流水号起始值
     */
    public SerialNumberGenerator(String prefix, int serialNumberLength, long startValue) {
        this.prefix = prefix;
        this.serialNumberLength = serialNumberLength;
        this.counter = new AtomicLong(startValue);
    }

    /**
     * 生成下一个编号
     * @return 格式化后的编号
     */
    public String generateNext() {
        long nextValue = counter.getAndIncrement();
        String format = "%0" + serialNumberLength + "d";
        String serialPart = String.format(format, nextValue);
        return prefix + serialPart;
    }

    /**
     * 获取当前计数器的值（不递增）
     * @return 当前计数器值
     */
    public long getCurrentValue() {
        return counter.get();
    }

    /**
     * 重置计数器
     * @param newValue 新的起始值
     */
    public void resetCounter(long newValue) {
        counter.set(newValue);
    }
}